跳到主要内容

07Bridge Pattern

桥接模式(Bridge Pattern)

​ 桥梁模式(Bridge Pattern)也叫做桥接模式。桥梁模式的重点是在“解耦”上, 如何让它们两者解耦是我们要了解的重点 .

意图: 将抽象部分与实现部分分离,使它们都可以独立的变化。

主要解决: 在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。

何时使用: 实现系统可能有多个角度分类,每一种角度都可能变化。

如何解决: 把这种多角度分类分离出来,让它们独立变化,减少它们之间耦合。

关键代码: 抽象类依赖实现类。

应用实例:

  • 1、猪八戒从天蓬元帅转世投胎到猪,转世投胎的机制将尘世划分为两个等级,即:灵魂和肉体,前者相当于抽象化,后者相当于实现化。生灵通过功能的委派,调用肉体对象的功能,使得生灵可以动态地选择。
  • 2、墙上的开关,可以看到的开关是抽象的,不用管里面具体怎么实现的。

优点:

  • 1、抽象和实现的分离。
  • 2、优秀的扩展能力。
  • 3、实现细节对客户透明。

缺点: 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。

使用场景:

  • 1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
  • 2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
  • 3、一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。

注意事项: 对于两个独立变化的维度,使用桥接模式再适合不过了。

#include <iostream>
using namespace std;

//桥接模式

class Line
{
public:
virtual void drawLinr()=0;
};

class DotLine:public Line
{
public:
void drawLinr()
{
cout<<"我可以画点线"<<endl;
}
};

class SolidLine:public Line
{
public:
void drawLinr()
{
cout<<"我可以画实线"<<endl;
}
};

class Shape
{
public:
Shape(int x=0,int y=0,Line *pl=nullptr)
:_x(x),_y(y),_pl(pl){}
virtual void drawShape()=0;
protected:
int _x,_y;
Line *_pl; //===========//
};

class Circle:public Shape
{
public:
Circle (int x=0,int y=0,int ridus=0,Line *pl=nullptr)
:Shape(x,y,pl),_ridus(ridus){}

void drawShape()
{
cout<<" draw from "<<"( "<<_x<<" , "<<_y<<" ) "<<" ridue "<<_ridus<<endl;

_pl->drawLinr();
}
protected:
int _ridus;
};

class Rect:public Shape
{
public:
Rect (int x=0,int y=0,int len=0,int wid=0,Line *pl=nullptr)
:Shape(x,y,pl),_len(len),_wid(wid){}

void drawShape()
{
cout<<" draw from "<<"( "<<_x<<" , "<<_y<<" ) "
<<" len "<<_len <<" wid "<<_wid<<endl;

_pl->drawLinr();
}
protected:
int _len;
int _wid;
};

int main(int argc, char *argv[])
{
// Circle c(1,2,3);
// c.drawShape();

// Rect r(1,2,3,4);
// r.drawShape();

DotLine dl;
Circle c(1,2,3,&dl);
c.drawShape();

SolidLine sl;
Rect r(1,2,3,4,&sl);
r.drawShape();

return 0;
}